class Observer {
  constructor(data) {
    this.walk(data)
  }

  // 遍历data 对象的所有属性
  walk (data) {
    // 判断data 是否对象
    if (!data || typeof data !== "object") return

    Object.keys(data).forEach(key =>{
        this.defineReactive(data, key, data[key])
    })
  }

  defineReactive (obj, key, val) {
    // 如果val 是对象,可以把val 对象的属性也转换成响应式数据
    this.walk(val)
    
    let _this = this
    Object.defineProperty(obj,key,{
      enumerable: true,
      configurable: true,
      get(){

        // 不能返回 obj[val] 会发生递归调用
        return val
      },
      set(val){
        if (val === data[key]) return
        data[key] = val
        _this.walk(val)
      }
    }) 
  }
}

